package com.un.ebs.workOrder.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.un.ebs.core.common.GroupListInfo;
import com.un.ebs.workOrder.domain.WorkOrder;
import com.un.ebs.workOrder.domain.WorkOrderExt;
import com.un.ebs.workOrder.dto.*;
import com.un.ebs.workOrder.enums.WorkOrderStatusEnum;
import net.sourceforge.jtds.jdbc.DateTime;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author liubo
 * @since 2019-11-18
 */
public interface WorkOrderService {

    /**
     * 创建工单
     *
     * @param req
     */
    String add(WorkOrderAddDto req, List<MultipartFile> files);

    /**
     * 创建工单，仅生成工单数据，需要调用者执行insert操作
     *
     * @param req
     * @return
     */
    WorkOrder addReady(int code, boolean isAutoComplete, WorkOrderAddDto req);

    List<WorkOrder> addReady(int code, int qty, boolean isAutoComplete, WorkOrderAddDto req);

    /**
     * 创建后续工单
     *
     * @param orderId
     * @param itemId
     */
    boolean startFollowUpItem(String orderId, String itemId);

    /**
     * 修改工单
     *
     * @param req
     */
    void update(WorkOrderUpdateDto req, List<MultipartFile> files);

    void updatePlanCompleteTime(List<WorkOrderChangePlanCompleteTimeDto> req);

    void updatePlanCompleteTime(String id, Date planCompleteTime, String remark);

    /**
     * 人员变更
     *
     * @param personnelId
     * @param personnelId
     */
    int changePersonnel(String personnelId, String toPersonnelId);

    /**
     * 订单交付任务分配，由工作人员分配
     *
     * @param req
     */
    List<String> assign(WorkOrderAssignDto req);

    /**
     * 撤销工单分配。
     *
     * @param id
     */
    void assignCancel(String id);

    /**
     * 提交工单
     *
     * @param id
     */
    void submit(String id);

    /**
     * 受理工单
     *
     * @param id     工单ID
     * @param remark 备注
     */
    void accept(String id, String remark, List<MultipartFile> files);

    /**
     * 完成工单
     *
     * @param id     工单ID
     * @param remark 备注
     */
    void complete(String id, String remark, Double qty, Double price, List<MultipartFile> files);

    /**
     * 对完工单做交付确认
     *
     * @param id
     * @param desc
     */
    void audit(String id, Boolean isPass, String desc);

    /**
     * 评价
     *
     * @param id     工单ID
     * @param score  评分
     * @param remark 意见反馈
     */
    void evaluate(String id, Integer score, String remark);

    void notify(String userId, WorkOrderExt data);

    /**
     * 查询单笔工单
     *
     * @param id 工单ID
     * @return
     */
    WorkOrderVo<DefunctMeetingDto> queryViewById(String id);

    /**
     * 查询工单详情
     *
     * @param id
     * @return
     */
    WorkOrderExt queryById(String id);

    /**
     * 查询指定的工单详情
     *
     * @param ids
     * @return
     */
    List<WorkOrderExt> queryByIds(List<String> ids);

    /**
     * 查询指定用户的工单状态统计
     *
     * @param userId
     * @return
     */
    List<GroupListInfo<WorkOrderExt>> queryStatusCount(String userId);

    /**
     * 根据订单明细ID查询所有工作
     *
     * @param id
     * @return
     */
    List<WorkOrder> queryByItemId(String id);

    List<WorkOrderExt> queryViewByItemId(String id);

    /**
     * 按订单查询工单
     *
     * @param orderId
     * @return
     */
    List<WorkOrderExt> queryViewByOrder(String orderId);

    /**
     * 工单查询
     *
     * @param userId    所属用户，如果为空，则表示所有
     * @param status    工单状态
     * @param pageSize
     * @param pageIndex
     * @return
     */
    IPage<WorkOrderExt> query(String userId, WorkOrderStatusEnum status, int pageIndex, int pageSize);

    /**
     * 工单查询，按客户ID
     * @param customerId
     * @param status
     * @param pageIndex
     * @param pageSize
     * @return
     */
    IPage<WorkOrderExt> queryByCustomer(String customerId, WorkOrderStatusEnum status, int pageSize, int pageIndex);
}
